package com.senlingspace.payment.douyin.bean.response;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;

import java.io.Serializable;
import java.util.List;

/**
 * Douyin订单响应实体类
 */
@Data
public class DouyinOrderResponse implements Serializable {


    @JsonProperty("data")
    private ResponseData data;


    /**
     * error_code 错误码，成功为0
     */
    @JsonProperty("extra")
    private DouyinCommonResponse.Extra extra;


    @Data
    public static class ResponseData implements Serializable {

        /**
         * 错误描述
         */
        @JsonProperty("description")
        private String description;

        /**
         * 错误码
         */
        @JsonProperty("error_code")
        private Integer errorCode;

        /**
         * 订单列表
         */
        @JsonProperty("orders")
        private List<Order> orders;


        /**
         * 页信息
         */
        @JsonProperty("page")
        private Page page;

        /**
         * 搜索后信息
         */
        @JsonProperty("search_after")
        private SearchAfter searchAfter;


        @Data
        public static class Order implements Serializable {

            /**
             * 金额信息
             */
            @JsonProperty("amount_info")
            private AmountInfo amountInfo;

            /**
             * 券
             */
            @JsonProperty("certificate")
            private List<Certificate> certificate;

            /**
             * 联系人信息（数组）：用户留资信息
             */
            @JsonProperty("contacts")
            private List<Contact> contacts;

            /**
             * 该笔订单包含的券数量
             */
            @JsonProperty("count")
            private Integer count;

            /**
             * 订单创建时间，10位时间戳，秒时间戳
             */
            @JsonProperty("create_order_time")
            private Long createOrderTime;

            /**
             * 外卖单相关信息（仅外卖有）
             */
            @JsonProperty("delivery_info")
            private DeliveryInfo deliveryInfo;

            /**
             * 折扣金额，单位分
             */
            @JsonProperty("discount_amount")
            private Long discountAmount;

            /**
             * 折扣列表。本字段将于2024-03-31日对服务商进行下线。
             */
            @JsonProperty("discounts")
            private List<Discount> discounts;

            /**
             * 意向门店
             */
            @JsonProperty("intention_poi_id")
            private String intentionPoiId;

            /**
             * 商家信息
             */
            @JsonProperty("merchant_info")
            private MerchantInfo merchantInfo;

            /**
             * 外部用户id
             */
            @JsonProperty("open_id")
            private String openId;

            /**
             * 抖音订单ID
             */
            @JsonProperty("order_id")
            private String orderId;

            /**
             * 订单状态
             * OrderStatus_Init 初始化 OrderStatus = 0
             * OrderStatus_WaitPay 待支付 OrderStatus = 100
             * OrderStatus_Cancel 订单关闭 OrderStatus = 101
             * OrderStatus_PaySuccess 支付成功 OrderStatus = 200
             * OrderStatus_Available 待使用 OrderStatus = 201
             * OrderStatus_Finish 交易成功 OrderStatus = 1
             */
            @JsonProperty("order_status")
            private Integer orderStatus;

            /**
             * 订单类型，21-团购，31-预售，41、90-外卖，51、70-次卡，60-券交易
             */
            @JsonProperty("order_type")
            private Integer orderType;

            /**
             * 原始金额,单位分
             */
            @JsonProperty("original_amount")
            private Integer originalAmount;

            /**
             * 实付金额，单位分。本字段将于2024-03-31日对服务商进行下线。
             */
            @JsonProperty("pay_amount")
            private Integer payAmount;

            /**
             * 订单支付时间，10位时间戳，秒时间戳
             */
            @JsonProperty("pay_time")
            private Long payTime;

            /**
             * 支付优惠。本字段将于2024-03-31日服务商进行下线。
             */
            @JsonProperty("payment_discount")
            private Integer paymentDiscount;

            /**
             * 门店信息（poi信息仅外卖类型订单才有）
             */
            @JsonProperty("poi")
            private Poi poi;

            /**
             * 下单时关联的poi_id（下单时的poi，不一定存在，如通过直播间场景购买）
             */
            @JsonProperty("poi_id")
            private String poiId;

            /**
             * 商品信息（只在团购和外卖场景下返回）
             */
            @JsonProperty("products")
            private List<Product> products;

            /**
             * 订单实收金额，即pay_amount+payment_discount
             */
            @JsonProperty("receipt_amount")
            private Long receiptAmount;

            /**
             * 直播间id
             */
            @JsonProperty("room_id")
            private String roomId;

            /**
             * 抖音的商品ID
             */
            @JsonProperty("sku_id")
            private String skuId;

            /**
             * 抖音的商品名称
             */
            @JsonProperty("sku_name")
            private String skuName;

            /**
             * 子单维度金额信息
             */
            @JsonProperty("sub_order_amount_infos")
            private List<SubOrderAmountInfo> subOrderAmountInfosList;

            /**
             * 三方服务商侧的商品ID
             */
            @JsonProperty("third_sku_id")
            private String thirdSkuId;

            /**
             * 最新修改时间，10位时间戳，秒时间戳
             */
            @JsonProperty("update_order_time")
            private Long updateOrderTime;


            /**
             * 门店信息（仅外卖类型订单才有）
             */
            @Data
            public class Poi implements Serializable {

                /**
                 * 门店id
                 */
                @JsonProperty("poi_id")
                private String poiId;

                /**
                 * 门店名称
                 */
                @JsonProperty("poi_name")
                private String poiName;

                // 其他字段和方法省略
            }


            @Data
            public static class AmountInfo implements Serializable {

                /**
                 * 商家活动补贴，单位分，仅外卖行业
                 */
                @JsonProperty("activities_fee_amount")
                private Long activitiesFeeAmount;

                /**
                 * 品牌方优惠金额
                 */
                @JsonProperty("brand_discount_amount")
                private Long brandDiscountAmount;

                /**
                 * 佣金，单位分，仅外卖行业
                 */
                @JsonProperty("commission_amount")
                private Long commissionAmount;

                /**
                 * 预计收入，单位分，仅外卖行业
                 */
                @JsonProperty("estimated_order_income")
                private Long estimatedOrderIncome;

                /**
                 * 用户支付配送费，单位分，仅外卖行业
                 */
                @JsonProperty("freight_pay_amount")
                private Long freightPayAmount;

                /**
                 * 自配送服务费，单位分（仅商家自配送），仅外卖行业
                 */
                @JsonProperty("merchant_deliver_freight_fee")
                private Long merchantDeliverFreightFee;

                /**
                 * 商家折扣金额
                 */
                @JsonProperty("merchant_discount_amount")
                private Long merchantDiscountAmount;

                /**
                 * 原始金额，单位分
                 */
                @JsonProperty("origin_amount")
                private Long originAmount;

                /**
                 * 支付金额
                 */
                @JsonProperty("pay_amount")
                private Long payAmount;

                /**
                 * 支付折扣金额
                 */
                @JsonProperty("pay_discount_amount")
                private Long payDiscountAmount;

                /**
                 * 平台配送服务费，单位分（仅平台配送），仅外卖行业
                 */
                @JsonProperty("platform_deliver_freight_fee")
                private Long platformDeliverFreightFee;

                /**
                 * 平台折扣金额
                 */
                @JsonProperty("platform_discount_amount")
                private Long platformDiscountAmount;

                /**
                 * 商品原始金额
                 */
                @JsonProperty("product_origin_amount")
                private Long productOriginAmount;

                /**
                 * 服务商优惠金额
                 */
                @JsonProperty("provider_discount_amount")
                private Long providerDiscountAmount;

                /**
                 * 商品售卖金额，单位分，仅外卖行业
                 */
                @JsonProperty("sale_price")
                private Long salePrice;
            }


            @Data
            public static class Certificate implements Serializable {
                /**
                 * 券码ID（不是原始券号）
                 */
                @JsonProperty("certificate_id")
                private String certificateId;

                /**
                 * 组套ID (仅组品模式下有值，为子品单所属组套的ID)
                 */
                @JsonProperty("combination_id")
                private String combinationId;

                /**
                 * item单（券维度的）订单状态
                 * <p>
                 * OrderItemStatus_Init 初始化 = 0
                 * OrderItemStatus_Finish 交易成功 = 1
                 * OrderItemStatus_WaitPay 待支付 = 10
                 * OrderItemStatus_PaySuccess 支付成功 = 20
                 * OrderItemStatus_Availabe 待使用 = 100
                 * OrderItemStatus_Close 交易关闭 = 101
                 * OrderItemStatus_Booking 预约中 = 200
                 * OrderItemStatus_BookSuccess 已预约 = 201
                 * OrderItemStatus_Refunding 退款中 = 300
                 * OrderItemStatus_RefundSuccess 已退款 = 301
                 * OrderItemStatus_Fulfilling 履约中 = 400
                 * OrderItemStatus_FulfilSuccess 已履约 = 401
                 */
                @JsonProperty("item_status")
                private Integer itemStatus;

                /**
                 * item单（券维度的）订单更新时间，秒时间戳
                 */
                @JsonProperty("item_update_time")
                private Long itemUpdateTime;

                /**
                 * 券维度的订单ID (组品模式下，对应子品单)
                 */
                @JsonProperty("order_item_id")
                private String orderItemId;

                /**
                 * 退款金额；仅退款（指客服强退）情况下订单状态仍为已履约，不返回退款时间与退款金额
                 */
                @JsonProperty("refund_amount")
                private Integer refundAmount;

                /**
                 * 退款完成时间，10位时间戳，秒时间戳
                 */
                @JsonProperty("refund_time")
                private Long refundTime;

            }

            @Data
            public static class Contact implements Serializable {
                /**
                 * 留资姓名
                 */
                @JsonProperty("name")
                private String name;

                /**
                 * 留资联系电话（中间四位脱敏）
                 */
                @JsonProperty("phone")
                private String phone;

                /**
                 * 留资联系电话（加密提供），已下线
                 */
                @JsonProperty("phone_encrypt")
                private String phoneEncrypt;

            }

            @Data
            public static class DeliveryInfo implements Serializable {

                /**
                 * 配送方式，1-自配送；2-三方配送；3-混合配送；4-用户自提; 7-全推模式（抖音设置配送费收费规则，选推则是商家自己设置，钱结给商家）
                 */
                @JsonProperty("deliver_model")
                private Integer deliverModel;

                /**
                 * 是否为预订单
                 */
                @JsonProperty("is_book")
                private Boolean isBookBool;

                /**
                 * 备注
                 */
                @JsonProperty("remark")
                private String remark;

                /**
                 * 流水号
                 */
                @JsonProperty("shop_number")
                private String shopNumber;

                /**
                 * 系统预计送达时间
                 */
                @JsonProperty("sys_expect_time")
                private String sysExpectTime;

                /**
                 * 餐具信息
                 */
                @JsonProperty("table_ware")
                private String tableWare;

                /**
                 * 用户期望送达时间
                 */
                @JsonProperty("user_expect_time")
                private String userExpectTime;

            }


            @Data
            public static class Discount implements Serializable {
                /**
                 * 品牌方优惠金额
                 */
                @JsonProperty("brand_discount_amount")
                private Long brandDiscountAmount;

                /**
                 * 折扣金额。本字段将于2024-03-31日对服务商进行下线。
                 */
                @JsonProperty("discount_amount")
                private Long discountAmount;

                /**
                 * 折扣类型。本字段将于2024-03-31日对服务商进行下线。
                 * 1 ：优惠券（满减）
                 * 2：活动（秒杀活动/商品立减）
                 * 3：支付营销
                 * 4：会员优惠
                 * 5：积分优惠
                 */
                @JsonProperty("discount_type")
                private Long discountType;

                /**
                 * 闲时优惠，透传营销结构
                 */
                @JsonProperty("idle_time_info")
                private IdleTimeInfo idleTimeInfo;

                /**
                 * 商家优惠。本字段将于2024-03-31日对服务商进行下线。
                 */
                @JsonProperty("merchant_discount_amount")
                private Long merchantDiscountAmount;

                /**
                 * 平台优惠。本字段将于2024-03-31日对服务商进行下线。
                 */
                @JsonProperty("platform_discount_amount")
                private Long platformDiscountAmount;

                /**
                 * 服务商优惠
                 */
                @JsonProperty("provider_discount_amount")
                private Long providerDiscountAmount;

            }

            @Data
            public static class MerchantInfo implements Serializable {
                /**
                 * 商家账户id
                 */
                @JsonProperty("account_id")
                private String accountId;

                /**
                 * 商家名称
                 */
                @JsonProperty("account_name")
                private String accountName;

            }


            @Data
            public static class Product implements Serializable {

                /**
                 * 数量
                 */
                @JsonProperty("num")
                private Integer num;

                /**
                 * 原始金额，单位分
                 */
                @JsonProperty("origin_amount")
                private Long originAmount;

                /**
                 * 商品id 同skuid
                 */
                @JsonProperty("product_id")
                private String productId;

                /**
                 * 商品名称
                 */
                @JsonProperty("product_name")
                private String productName;

                /**
                 * 商品id，同skuid
                 */
                @JsonProperty("sku_id")
                private String skuId;

                /**
                 * 商品快照
                 */
                @JsonProperty("snapshot_product")
                private SnapshotProduct snapshotProduct;


                /**
                 * 商品快照类
                 */
                @Data
                static class SnapshotProduct implements Serializable {

                    /**
                     * 商品属性
                     */
                    @JsonProperty("product_attr")
                    private ProductAttr productAttr;

                    /**
                     * 商品标签列表
                     */
                    @JsonProperty("tag_info_list")
                    private List<TagInfoList> tagInfoList;


                    /**
                     * 商品属性
                     */
                    @Data
                    public static class ProductAttr implements Serializable {

                        /**
                         * 动态规则
                         */
                        @JsonProperty("dynamic_par_rule")
                        private DynamicParRule dynamicParRule;


                        /**
                         * 展示渠道
                         */
                        @JsonProperty("show_channel")
                        private ShowChannel showChannel;


                        /**
                         * 动态规则
                         */
                        @Data
                        public static class DynamicParRule implements Serializable {

                            /**
                             * 代金券面值-最高可抵金额
                             */
                            @JsonProperty("dynamic_par_max_amount")
                            private Long dynamicParMaxAmount;

                            /**
                             * 代金券面值-最低可抵金额
                             */
                            @JsonProperty("dynamic_par_min_amount")
                            private Long dynamicParMinAmount;

                            /**
                             * 可抵扣金额文案
                             */
                            @JsonProperty("dynamic_par_rule_desc")
                            private String dynamicParRuleDesc;

                            /**
                             * 收起子属性
                             */
                            @JsonProperty("dynamic_par_rule_item_list")
                            private List<DynamicParRuleItemList> dynamicParRuleItemList;

                            /**
                             * 收起子属性
                             */
                            @Data
                            public static class DynamicParRuleItemList implements Serializable {

                                /**
                                 * 星期几 多选
                                 */
                                @JsonProperty("day_of_week")
                                private List<DayOfWeek> dayOfWeek;

                                /**
                                 * 抵扣金额 整数，默认单位分
                                 */
                                @JsonProperty("deductible_amount")
                                private Long deductibleAmount;

                                /**
                                 * 时间段(hh:mm)
                                 */
                                @JsonProperty("time_period")
                                private TimePeriod timePeriod;

                                /**
                                 * 星期几枚举
                                 */
                                enum DayOfWeek {
                                    MONDAY(1),
                                    TUESDAY(2),
                                    WEDNESDAY(3),
                                    THURSDAY(4),
                                    FRIDAY(5),
                                    SATURDAY(6),
                                    SUNDAY(7);

                                    private final int value;

                                    DayOfWeek(int value) {
                                        this.value = value;
                                    }

                                    public int getValue() {
                                        return value;
                                    }
                                }

                                /**
                                 * 时间段
                                 */
                                @Data
                                public static class TimePeriod implements Serializable {

                                    /**
                                     * 开始时间 00:00:00
                                     */
                                    @JsonProperty("use_start_time")
                                    private String useStartTime;

                                    /**
                                     * 结束时间 00:00:00
                                     */
                                    @JsonProperty("use_end_time")
                                    private String useEndTime;

                                    /**
                                     * 是否跨天
                                     */
                                    @JsonProperty("end_time_is_next_day")
                                    private Boolean endTimeIsNextDay;
                                }
                            }
                        }

                        /**
                         * 展示渠道枚举
                         */
                        enum ShowChannel {
                            UNLIMIT(1),
                            ONLY_LIVING_ROOM(2),
                            NOT_FOR_SALE(3),
                            ONLY_TRADE(4),
                            OFFLINE(5),
                            INFLUENCER(6),
                            NEWBIE(7),
                            ONLINE(8),
                            ONLY_COUPON_PACKAGE(9),
                            LIVE_AND_VIDEO(10),
                            VIDEO(11),
                            SUPER_SKU(12),
                            EXCHANGE(13),
                            LIVE_AND_NEG(14),
                            SP_FREE(15),
                            SP_RANK(16);

                            private final int value;

                            ShowChannel(int value) {
                                this.value = value;
                            }

                            public int getValue() {
                                return value;
                            }
                        }


                        /**
                         * 动态规则类型
                         */
                        @JsonProperty("voucher_par_type")
                        private VoucherParType voucherParType;

                        /**
                         * 动态规则类型
                         */
                        public enum VoucherParType {
                            FIXED_PAR(1),
                            DYNAMIC_PAR(2);

                            private final int value;

                            VoucherParType(int value) {
                                this.value = value;
                            }

                            public int getValue() {
                                return value;
                            }
                        }
                    }


                    /**
                     * 商品标签列表
                     */
                    @Data
                    public static class TagInfoList implements Serializable {
                        @JsonProperty("tag_key")
                        private String tagKey;

                        @JsonProperty("tag_name")
                        private String tagName;

                        @JsonProperty("tag_value")
                        private String tagValue;
                    }
                }

            }


            /**
             * 子单维度金额信息
             */
            @Data
            public static class SubOrderAmountInfo implements Serializable {

                /**
                 * 子单id，类型为1时为item_id, 234为order_fee_id
                 */
                @JsonProperty("sub_order_id")
                private String subOrderId;

                /**
                 * 子单类型 1:配送费 2:打包费 3:服务费 100:商品费用
                 */
                @JsonProperty("sub_order_type")
                private Integer subOrderType;

                /**
                 * 原始金额，单位分
                 */
                @JsonProperty("origin_amount")
                private Long originAmount;

                /**
                 * 实付金额，单位分。本字段将于2024-03-31日对服务商进行下线
                 */
                @JsonProperty("pay_amount")
                private Long payAmount;

                /**
                 * 实收金额，单位分。本字段将于2024-03-13日上线
                 */
                @JsonProperty("receipt_amount")
                private Long receiptAmount;

                /**
                 * 折扣金额，单位分
                 */
                @JsonProperty("discount_amount")
                private Long discountAmount;

                /**
                 * 组套id (仅组品模式下有值，为子品单所属组套的id)
                 */
                @JsonProperty("combination_id")
                private String combinationId;

                /**
                 * 折扣列表。本字段将于2024-03-31日对服务商进行下线
                 */
                @JsonProperty("discounts")
                private List<Discount> discounts;

                /**
                 * 服务商优惠金额
                 */
                @JsonProperty("provider_discount_amount")
                private Long providerDiscountAmount;

                /**
                 * 品牌方优惠金额
                 */
                @JsonProperty("brand_discount_amount")
                private Long brandDiscountAmount;

                /**
                 * 平台优惠。本字段将于2024-03-31日对服务商进行下线
                 */
                @JsonProperty("platform_discount_amount")
                private Long platformDiscountAmount;

                /**
                 * 商家优惠。本字段将于2024-03-31日对服务商进行下线
                 */
                @JsonProperty("merchant_discount_amount")
                private Long merchantDiscountAmount;

                /**
                 * 闲时优惠，透传营销结构
                 */
                @JsonProperty("idle_time_info")
                private IdleTimeInfo idleTimeInfo;

                /**
                 * 折扣信息
                 */
                @Data
                public static class Discount implements Serializable {

                    /**
                     * 品牌方优惠金额
                     */
                    @JsonProperty("brand_discount_amount")
                    private Long brandDiscountAmount;

                    /**
                     * 折扣金额。本字段将于2024-03-31日对服务商进行下线
                     */
                    @JsonProperty("discount_amount")
                    private Long discountAmount;

                    /**
                     * 折扣类型。本字段将于2024-03-31日对服务商进行下线
                     * 1-优惠券 2-活动 3-支付营销 4-会员优惠 5-积分优惠
                     */
                    @JsonProperty("discount_type")
                    private Integer discountType;


                }

                /**
                 * 闲时优惠信息
                 */
                @Data
                public static class IdleTimeInfo implements Serializable {

                    /**
                     * 错峰特惠是否强卡控
                     */
                    @JsonProperty("idle_time_limit_type")
                    private IdleTimeLimitTypeEnum idleTimeLimitType;

                    /**
                     * 核销时间限制
                     */
                    @JsonProperty("write_off_time_limit")
                    private WriteOffTimeLimit writeOffTimeLimit;

                    /**
                     * 错峰特惠枚举
                     */
                    public enum IdleTimeLimitTypeEnum {
                        WRITE_OFF_ALLOW_ANY_TIME(1),
                        WRITE_OFF_ONLY_NOT_PEAK_TIME(2);

                        private final int value;

                        IdleTimeLimitTypeEnum(int value) {
                            this.value = value;
                        }

                        public int getValue() {
                            return value;
                        }
                    }

                    /**
                     * 核销时间限制
                     */
                    @Data
                    public static class WriteOffTimeLimit implements Serializable {

                        /**
                         * 每日时间范围
                         */
                        @JsonProperty("daily_time_range_list")
                        private List<DailyTimeRange> dailyTimeRangeList;

                        /**
                         * 优惠券使用相对时间
                         */
                        @JsonProperty("relative_time")
                        private RelativeTime relativeTime;


                        /**
                         * 星期几
                         */
                        @JsonProperty("week_day_list")
                        private List<RelativeTime.WeekDayEnum> weekDayList;


                        /**
                         * 优惠券使用开始时间(绝对时间，时间戳，秒，当天00:00:00点)
                         */
                        @JsonProperty("write_off_start_time")
                        private Long writeOffStartTime;

                        /**
                         * 优惠券使用结束时间(绝对时间，时间戳，秒，当天23:59:59点)
                         */
                        @JsonProperty("write_off_end_time")
                        private Long writeOffEndTime;

                        /**
                         * 每日时间范围
                         */
                        @Data
                        public static class DailyTimeRange implements Serializable {

                            /**
                             * 生效开始时间   "08:00:00"
                             */
                            @JsonProperty("start_time")
                            private String startTime;

                            /**
                             * 生效结束时间   "09:00:00"
                             */
                            @JsonProperty("end_time")
                            private String endTime;
                        }

                        /**
                         * 相对时间信息
                         */
                        @Data
                        public static class RelativeTime implements Serializable {

                            /**
                             * 相对时间类型
                             */
                            @JsonProperty("relative_time_type")
                            private RelativeTimeType relativeTimeType;

                            /**
                             * 相对时间
                             */
                            @JsonProperty("relative_time")
                            private Long relativeTime;

                            /**
                             * 相对时间类型枚举
                             */
                            public enum RelativeTimeType {
                                SECOND(0),
                                HOUR(1),
                                DAY(2);

                                private final int value;

                                RelativeTimeType(int value) {
                                    this.value = value;
                                }

                                public int getValue() {
                                    return value;
                                }
                            }

                            /**
                             * 星期几枚举
                             */
                            public enum WeekDayEnum {
                                MONDAY(1),
                                TUESDAY(2),
                                WEDNESDAY(3),
                                THURSDAY(4),
                                FRIDAY(5),
                                SATURDAY(6),
                                SUNDAY(7),
                                ALL(8);

                                private final int value;

                                WeekDayEnum(int value) {
                                    this.value = value;
                                }

                                public int getValue() {
                                    return value;
                                }
                            }
                        }
                    }
                }
            }


        }


        @Data
        public static class Page implements Serializable {
            @JsonProperty("page_num")
            private Integer pageNum;

            @JsonProperty("page_size")
            private Integer pageSize;

            @JsonProperty("total")
            private Long total;
        }

        @Data
        public static class SearchAfter implements Serializable {
            @JsonProperty("all_cursor_value")
            private List<List<String>> allCursorValue;

            @JsonProperty("cursor_value_list")
            private List<String> cursorValueList;

            @JsonProperty("size")
            private Integer size;
        }


        @Data
        class IdleTimeInfo implements Serializable {

            /**
             * 错峰特惠是否强卡控
             */
            @JsonProperty("idle_time_limit_type")
            private IdleTimeLimitTypeEnum idleTimeLimitTypeEnum;

            /**
             * 核销时间限制
             */
            @JsonProperty("write_off_time_limit")
            private WriteOffTimeLimit writeOffTimeLimit;

        }

        enum IdleTimeLimitTypeEnum implements Serializable {

            /**
             * 允许任何时间核销
             */
            @JsonProperty("write_off_allow_any_time")
            WRITE_OFF_ALLOW_ANY_TIME(1),

            /**
             * 仅允许闲时核销
             */
            @JsonProperty("write_off_only_not_peak_time")
            WRITE_OFF_ONLY_NOT_PEAK_TIME(2);

            private int value;

            IdleTimeLimitTypeEnum(int value) {
                this.value = value;
            }

            public int getValue() {
                return value;
            }
        }

        /**
         * 优惠券使用相对时间，建议使用方不感知(建议使用绝对时间 WriteOffStartTime/WriteOffEndTime)，
         * 如果有特殊需求再自行解析。
         */
        @Data
        class WriteOffTimeLimit implements Serializable {

            /**
             * 每日时间范围
             */
            @JsonProperty("daily_time_range_list")
            private List<DailyTimeRangeList> dailyTimeRangeList;


            /**
             * 优惠券使用相对时间，建议使用方不感知(建议使用绝对时间 WriteOffStartTime/WriteOffEndTime)，如果有特殊需求再自行解析
             */
            @JsonProperty("relative_time")
            private RelativeTime relativeTime;


            /**
             * 星期几
             * MONDAY=1, TUESDAY=2, WEDNESDAY=3, THURSDAY=4, FRIDAY=5, SATURDAY=6, SUNDAY=7, ALL=8
             */
            @JsonProperty("week_day_list")
            private List<WeekDayList> weekDayList;

            /**
             * 优惠券使用结束时间(绝对时间，时间戳，秒，当天23:59:59点)，
             * 如果营销只传相对时间，交易会将相对时间转换为绝对时间，并覆盖该字段
             */
            @JsonProperty("write_off_end_time")
            private Long writeOffEndTimeInt64;

            /**
             * 优惠券使用开始时间(绝对时间，时间戳，秒，当天00:00:00点)，
             * 如果营销只传相对时间，交易会将相对时间转换为绝对时间，并覆盖该字段
             */
            @JsonProperty("write_off_start_time")
            private Long writeOffStartTimeInt64;

        }

        /**
         * 星期几枚举
         */
        enum WeekDayList {
            MONDAY(1),
            TUESDAY(2),
            WEDNESDAY(3),
            THURSDAY(4),
            FRIDAY(5),
            SATURDAY(6),
            SUNDAY(7),
            ALL(8);

            private final int value;

            WeekDayList(int value) {
                this.value = value;
            }

            public int getValue() {
                return value;
            }

            public static WeekDayList fromValue(int value) {
                for (WeekDayList day : WeekDayList.values()) {
                    if (day.value == value) {
                        return day;
                    }
                }
                throw new IllegalArgumentException("Unexpected value: " + value);
            }
        }

        @Data
        class DailyTimeRangeList implements Serializable {

            /**
             * 生效结束时间
             */
            @JsonProperty("end_time")
            private String endTime;

            /**
             * 生效开始时间
             */
            @JsonProperty("start_time")
            private String startTime;

        }

        @Data
        class RelativeTime implements Serializable {

            /**
             * 相对时间类型
             * SECOND=0
             * HOUR=1
             * DAY=2
             */
            @JsonProperty("relative_time_type")
            private RelativeTimeType relativeTimeType;

            /**
             * 相对时间
             */
            @JsonProperty("relative_time")
            private Long relativeTime;

        }


        /**
         * 相对时间类型
         */
        enum RelativeTimeType {
            /**
             * 秒
             */
            @JsonProperty("SECOND")
            SECOND(0),

            /**
             * 小时
             */
            @JsonProperty("HOUR")
            HOUR(1),

            /**
             * 天
             */
            @JsonProperty("DAY")
            DAY(2);

            private final int value;

            RelativeTimeType(int value) {
                this.value = value;
            }

            public int getValue() {
                return value;
            }
        }


    }


}
